import axios from 'axios';
import service from './myApi';
import store from '../store';

let instance = axios.create({
  baseURL: 'https://ok.wentiertong.com',
  timeout: 3000
});

const Http = {}; // 包裹请求方法的容器

// 对 service 进行循环遍历输出不同的请求方法
// 下边会将 请求格式/参数 进行统一为 params，isFormData，config
for(let key in service){
  let api = service[key]  //api包含url method

  // 参数1 --- 请求参数params
  // get请求的话，参数放到URL上
  // post、put、patch请求的话，对应的参数是data
  // delete请求的话，默认放在URL上
  // 参数2 --- isFormData 标识是否是 form-data 请求，默认不是
  // 参数3 --- config 配置参数，可以在这里设置 headers、params、data等

  Http[key] = async function(//方法接受的参数
    params,
    isFormData = false,
    config = {}
  ){
    //声明新变量，判断content-type是否是form-data时候的参数的转换
    let newParams = {};

    // 判断 content-type 是否是 form-data
    if(params && isFormData){
      newParams = new FormData();  //创建一个form-data格式的对象
      for(let i in params){
        newParams.append(i,params[i]);
      }
    }else{
      //不是form-data 
      newParams = params
    }
    
    // 不同请求的判断
    let response = {};  //请求的返回值
    if (api.method === 'post' || api.method === 'put' || api.method === 'patch'){
      try{
        response = await instance[api.method](api.url, newParams,config);
      }catch(err){
        response = err;
      }
    } else if (api.method === 'get' || api.method === 'delete'){
      config.params = newParams;
      try {
        response = await instance[api.method](api.url, config);
      } catch (err) {
        response = err;
      }
    }
    return response;  //返回响应值
  }
}

//请求拦截器
instance.interceptors.request.use(
  config => {
    //发起请求前做什么
    // console.log('发起请求',config);
    return config;
  },
  () => {
    //请求错误
    store.commit('showMessage', { message: '请求错误，请稍后重试!' , type: 'error' });
    return Promise.reject();
  }
);

//响应拦截器
instance.interceptors.response.use(
  //响应成功
  res => {
    // console.log('请求成功',res.data);
    return res.data;
  },
  () => {
    store.commit('showMessage', { message: '请求错误，请稍后重试!' , type: 'error' });
    return Promise.reject();
  }
);

export default Http;